/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Autor.....: Marlos Andre Marques
 Professor.: Luiz Affonso
 Disciplina: DCA 2401 - Sistemas Distribuidos
 Nome......: semaforo.java
 Funcao....: implementa a classe Semaforo em Java utilizando synchronized
 Inicio....: 27/mai/2004
 Alteracao.: 03/jun/2004: esperando tem que ser decrementado no metodo P(), pois o
             thread desbloqueado volta a executar neste ponto.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/

final class Semaforo {

  private int valor;	//valor do semaforo
  private int esperando = 0;	//quantidade de processos bloqueados por UM DETERMINADO semaforo

  public Semaforo (int i) { //construtor: inicia o semaforo adequadamente
		valor = i ;
  } //fim do construtor

  synchronized void P() { //ou DOWN()
    if ( valor > 0 ) //verifica o valor do semaforo
			valor--; //se semaforo maior que zero, decrementa o valor do do semaforo
    else {
			esperando++;	//senao, incrementa o numero de threads suspensas
			try { wait(); } catch (InterruptedException e) { }; //senao o processo que executou a operacao P (ou DOWN) e' suspenso
			esperando--;
		};	//fim do else/if
  } //fim do metodo P()

  synchronized void V() { //ou UP()
		if (esperando > 0) //se tem processo na fila de espera
			notify(); //tira processo da fila de espera
		else 	 
			valor++;	//senao, incrementa o valor do semaforo
  } //fim do metodo V()
} //fim da classe Semaforo